home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Applications / Eudora 1.3.1 / source / mytcp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-16  |  7.3 KB  |  288 lines  |  [TEXT/MPS ]

  1. #define FILE_NUM 27
  2. /* Copyright (c) 1990-1992 by the University of Illinois Board of Trustees */
  3. /************************************************************************
  4.  * routines to make MacTCP palatable
  5.  ************************************************************************/
  6. #pragma load EUDORA_LOAD
  7. #pragma segment TcpTrans
  8.  
  9. short TcpSpinOn(TCPiopb *pb,Boolean doAbort);
  10.  
  11. static short RefN=0;
  12. /************************************************************************
  13.  *
  14.  ************************************************************************/
  15. int MyTcpCreate(long *stream,UPtr buffer,int bSize,TCPNotifyProc asr)
  16. {
  17.     TCPiopb pb;
  18.     int err;
  19.     
  20.     if (!RefN) return(badUnitErr);
  21.     if (WhyTCPTerminated) return(WhyTCPTerminated);
  22.     WriteZero(&pb,sizeof(pb));
  23.     pb.ioCRefNum = RefN;
  24.     pb.csCode = TCPCreate;
  25.  
  26.     pb.csParam.create.rcvBuff = buffer;
  27.     pb.csParam.create.rcvBuffLen = bSize;
  28.     pb.csParam.create.notifyProc = asr;
  29.     
  30.     err = PBControl(&pb,False);
  31.     if (!err) *stream = pb.tcpStream;
  32.     return(err ? err : pb.ioResult);
  33. }
  34.  
  35. /************************************************************************
  36.  *
  37.  ************************************************************************/
  38. int MyTcpOpen(long stream,long addr,short port,Byte toAction,Byte timeout)
  39. {
  40.     TCPiopb pb;
  41.     int err;
  42.     
  43.     if (!RefN) return(badUnitErr);
  44.     if (WhyTCPTerminated) return(WhyTCPTerminated);
  45.     WriteZero(&pb,sizeof(pb));
  46.     pb.ioCRefNum = RefN;
  47.     pb.tcpStream = stream;
  48.     pb.csCode = TCPActiveOpen;
  49.     
  50.     pb.csParam.open.commandTimeoutValue = timeout;
  51.     pb.csParam.open.ulpTimeoutValue = timeout;
  52.     pb.csParam.open.ulpTimeoutAction = toAction;
  53.     pb.csParam.open.validityFlags = timeoutValue | timeoutAction;
  54.     pb.csParam.open.remoteHost = addr;
  55.     pb.csParam.open.remotePort = port;
  56.     pb.csParam.open.localPort = GetRLong(LOCAL_PORT);
  57.     err = PBControl(&pb,True);
  58.     if (err==inProgress) err=0;
  59.     if (err) return(err);
  60.     return(TcpSpinOn(&pb,True));
  61. }
  62.  
  63. /************************************************************************
  64.  *
  65.  ************************************************************************/
  66. int MyTcpSend(long stream,short count,UPtr buffer,int bSize, va_list extra)
  67. {
  68.     wdsEntry myWDS[40];
  69.     wdsEntry *exWDS;
  70.         
  71.     if (!RefN) return(badUnitErr);
  72.     if (WhyTCPTerminated) return(WhyTCPTerminated);
  73.     myWDS[0].length = bSize;
  74.     myWDS[0].ptr = buffer;
  75.     for (exWDS=myWDS+1;--count>0;exWDS++)
  76.     {
  77.         exWDS->ptr = va_arg(extra,UPtr);
  78.         exWDS->length = va_arg(extra,unsigned);
  79.         if (!exWDS->length) exWDS--;                /* skip zero-length sends */
  80.     }
  81.     exWDS->length = 0;
  82.     return(MyTcpSendWDS(stream,myWDS));
  83. }
  84.  
  85. /************************************************************************
  86.  *
  87.  ************************************************************************/
  88. int MyTcpSendWDS(long stream,wdsEntry *theWDS)
  89. {
  90.     TCPiopb pb;
  91.     int err;
  92.     
  93.     if (!RefN) return(badUnitErr);
  94.     if (WhyTCPTerminated) return(WhyTCPTerminated);
  95.     if (!theWDS->length)
  96.         return(noErr);
  97.  
  98.     WriteZero(&pb,sizeof(pb));
  99.     pb.ioCRefNum = RefN;
  100.     pb.tcpStream = stream;
  101.     pb.csCode = TCPSend;
  102.  
  103.     pb.csParam.send.pushFlag = 1;
  104.     pb.csParam.send.wdsPtr = theWDS;
  105.     
  106.     if (!DontTranslate && TransOut)
  107.     {
  108.         wdsEntry *wds;
  109.         UPtr cp;
  110.         for (wds=theWDS;wds->length;wds++)
  111.             for (cp=wds->ptr;cp<wds->ptr+wds->length;cp++) *cp = TransOut[*cp];
  112.     }
  113.  
  114.     if (LogLevel&LOG_TRANS)
  115.     {
  116.         wdsEntry *wds;
  117.         for (wds=theWDS;wds->length;wds++)
  118.             CarefulLog(LOG_TRANS,LOG_SENT,wds->ptr,wds->length);
  119.     }
  120.     
  121.     err = PBControl(&pb,True);
  122.     if (err) return(err);
  123.     return(TcpSpinOn(&pb,False));
  124. }
  125.  
  126. /************************************************************************
  127.  *
  128.  ************************************************************************/
  129. int MyTcpRecv(long stream,UPtr buffer,int *bSize,Byte timeout)
  130. {
  131.     TCPiopb pb;
  132.     int err;
  133.     
  134.     if (!RefN) return(badUnitErr);
  135.     if (WhyTCPTerminated) return(WhyTCPTerminated);
  136.     WriteZero(&pb,sizeof(pb));
  137.     pb.ioCRefNum = RefN;
  138.     pb.tcpStream = stream;
  139.     pb.csCode = TCPRcv;
  140.  
  141.     pb.csParam.receive.commandTimeoutValue = timeout;
  142.     pb.csParam.receive.rcvBuff = buffer;
  143.     pb.csParam.receive.rcvBuffLen = *bSize;
  144.     *bSize = 0;
  145.     
  146.     err = PBControl(&pb,True);
  147.     if (err) return(err);
  148.     err = TcpSpinOn(&pb,False);
  149.     if (!err)
  150.         *bSize = pb.csParam.receive.rcvBuffLen;
  151.     if (*bSize && LogLevel&LOG_TRANS) CarefulLog(LOG_TRANS,LOG_GOT,buffer,*bSize);
  152.     return(err);
  153. }
  154.  
  155. /************************************************************************
  156.  *
  157.  ************************************************************************/
  158. int MyTcpStatus(long stream,TCPiopb *pb)
  159. {
  160.     int err;
  161.     
  162.     if (!RefN) return(badUnitErr);
  163.     if (WhyTCPTerminated) return(WhyTCPTerminated);
  164.     WriteZero(pb,sizeof(*pb));
  165.     pb->ioCRefNum = RefN;
  166.     pb->tcpStream = stream;
  167.     pb->csCode = TCPStatus;
  168.  
  169.     return(err = PBControl(pb,False));
  170. }
  171.  
  172. /************************************************************************
  173.  *
  174.  ************************************************************************/
  175. int MyTcpClose(long stream)
  176. {
  177.     TCPiopb pb;
  178.     int err;
  179.     
  180.     if (!RefN) return(badUnitErr);
  181.     if (WhyTCPTerminated) return(WhyTCPTerminated);
  182.     WriteZero(&pb,sizeof(pb));
  183.     pb.ioCRefNum = RefN;
  184.     pb.tcpStream = stream;
  185.     pb.csCode = TCPClose;
  186.     
  187.     err = PBControl(&pb,True);
  188.     if (err) return(err);
  189.     return(TcpSpinOn(&pb,True));
  190. }
  191.  
  192. /************************************************************************
  193.  *
  194.  ************************************************************************/
  195. int MyTcpAbort(long stream)
  196. {
  197.     TCPiopb pb;
  198.     int err;
  199.     
  200.     if (!RefN) return(badUnitErr);
  201.     if (WhyTCPTerminated) return(WhyTCPTerminated);
  202.     WriteZero(&pb,sizeof(pb));
  203.     pb.ioCRefNum = RefN;
  204.     pb.tcpStream = stream;
  205.     pb.csCode = TCPAbort;
  206.     
  207.     err = PBControl(&pb,False);
  208.     return(err ? err : pb.ioResult);
  209. }
  210.  
  211. /************************************************************************
  212.  *
  213.  ************************************************************************/
  214. short MyTcpRefN(short refN)
  215. {
  216.     if (refN) RefN = refN;
  217.     return(RefN);
  218. }
  219.  
  220. /************************************************************************
  221.  *
  222.  ************************************************************************/
  223. int MyTcpRelease(long stream)
  224. {
  225.     TCPiopb pb;
  226.     int err;
  227.     
  228.     if (!RefN) return(badUnitErr);
  229.     WriteZero(&pb,sizeof(pb));
  230.     pb.ioCRefNum = RefN;
  231.     pb.tcpStream = stream;
  232.     pb.csCode = TCPRelease;
  233.  
  234.     err = PBControl(&pb,False);
  235.     return(err ? err : pb.ioResult);
  236. }
  237.  
  238. /************************************************************************
  239.  * MyHostid - figure out my address and net mask
  240.  ************************************************************************/
  241. int MyHostid(ip_addr *addr, long *mask)
  242. {
  243.     struct IPParamBlock pb;
  244.     int err;
  245.     
  246.     if (!RefN) return(badUnitErr);
  247.     pb.ioCompletion = nil;
  248.     pb.ioNamePtr = nil;
  249.     pb.ioCRefNum = RefN;
  250.     pb.ioVRefNum = 0;
  251.     pb.csCode = ipctlGetAddr;
  252.  
  253.     err = PBControl(&pb,False);
  254.     if (!err)
  255.     {
  256.         *addr = pb.ourAddress;
  257.         *mask = pb.ourNetMask;
  258.     }
  259.     return(err ? err : pb.ioResult);
  260. }
  261.  
  262. /************************************************************************
  263.  * TcpSpinOn - spin, allowing cancellation, but only AFTER the operation
  264.  * actually completes (I'm cutting this part; dunno why it was here)
  265.  ************************************************************************/
  266. short TcpSpinOn(TCPiopb *pb,Boolean doAbort)
  267. {
  268.     short err;
  269.  
  270. #ifndef OLDCODE
  271.     doAbort = True;
  272. #endif
  273.  
  274.     err = SpinOn(&pb->ioResult,0);
  275.     if (err==userCancelled)
  276.     {
  277.         if (doAbort)
  278.         {
  279.             MyTcpAbort(pb->tcpStream);
  280.         }
  281.         else
  282.             while (SpinOn(&pb->ioResult,0)==userCancelled);
  283.         return(userCancelled);
  284.     }
  285.     if (WhyTCPTerminated) return(WhyTCPTerminated);
  286.     return(err);
  287. }
  288.